#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>


#define GPIO_PIN    112


static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
{
    printk(KERN_EMERG "this is irq_handler!\r\n");
    printk(KERN_EMERG "interrupt occurred on GPIO %d\r\n", GPIO_PIN);
    
    return IRQ_HANDLED;
}

static int __init gpio_irq_init(void)
{
    int irq_num;
    printk(KERN_EMERG "init gpio interrupt driver\r\n");


    irq_num = gpio_to_irq(GPIO_PIN);
    printk(KERN_EMERG "gpio (%d) mapped to IRQ (%d)\r\n", GPIO_PIN, irq_num);

    if (request_irq(irq_num, gpio_irq_handler, IRQF_TRIGGER_RISING, "irq_test", NULL) < 0)
    {
        printk(KERN_EMERG "request_irq (%d) Failed\r\n", GPIO_PIN);
        //请求中断失败，释放GPIO引脚
        gpio_free(GPIO_PIN);
        return -ENODEV;     /* No such device */
    }

    return 0;
}
static void __exit gpio_irq_exit(void)
{
    int irq_num;
    irq_num = gpio_to_irq(GPIO_PIN);
    free_irq(irq_num, NULL);
    printk(KERN_EMERG "module exit\r\n");
}


module_init(gpio_irq_init);
module_exit(gpio_irq_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Treasure1029");